package com.osdp.common.util;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.poi.ss.usermodel.IndexedColors;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.List;

/**
 * Excels
 *
 * @author
 * @since
 */
@Data
public class Excels {

    public static enum Type {
        DEFAULT,
        TEXT,
        NUMBER,
        DATE,
        FORMULA,
        PICTURE;
    }

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    public @interface ExcelConfig {
        /**
         * 样式
         */
        Style[] styles();

        /**
         * 锁定行
         */
        int freezeColOrder() default -1;

        /**
         * 锁定表头
         */
        boolean freezeHeader() default false;

        /**
         * 行高
         */
        int rowHeight() default 16;
    }

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    public @interface Style {
        /**
         * 样式名称
         */
        String name();

        /**
         * 字体
         */
        String fontFamily() default "宋体";

        /**
         * 字体大小
         */
        short fontSize() default 10;

        /**
         * 字体颜色
         */
        IndexedColors fontColor() default IndexedColors.BLACK;

        /**
         * 是否加粗
         */
        boolean bold() default false;

        /**
         * 背景色
         */
        IndexedColors bgColor() default IndexedColors.WHITE;

        /**
         * 数据格式
         */
        String dataFormat() default "";
    }

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    public @interface Cell {
        /**
         * 表头名称
         */
        String name();

        /**
         * 输出序号
         */
        int order();

        /**
         * 数据类型
         */
        Type type() default Type.DEFAULT;

        /**
         * 样式名称
         */
        String styleName() default "";

        /**
         * 表头样式名称
         */
        String headerStyleName() default "";

        /**
         * 函数
         */
        String formula() default "";

        /**
         * 单元格宽度
         */
        int width() default 0;

        /**
         * 导入时该字段是否必需，如果该字段为空或 NULL，那么导入时整条数据都认为无用数据
         */
        boolean importRequired() default false;

        /**
         * 数据单元格的批注的字段名称
         */
        String cellCommentFieldName() default "";

        /**
         * 表头批注
         */
        String headerComment() default "";

        String cellDataValidateVariableName() default "";
    }

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class CellData {
        private String name;
        private int order;
        private Type type;
        private String styleName;
        private String headerStyleName;
        private String formula;
        private int width;
        private boolean importRequired;
        private String cellCommentFieldName;
        private String headerComment;
        private String cellDataValidateVariableName;
        //自定义 Cell 配置时使用
        /**
         * 数据字段名称
         */
        private String dataFieldName;
        /**
         * 数据的类型
         */
        private Class<?> dataFieldType;
        /**
         * 真实的列号，在程序处理过程中才生成
         */
        private Integer cellIndex;
    }

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class StyleData {
        private String name;
        @Builder.Default
        private String fontFamily = "宋体";
        @Builder.Default
        private short fontSize = 10;
        @Builder.Default
        private IndexedColors fontColor = IndexedColors.BLACK;
        private boolean bold;
        @Builder.Default
        private IndexedColors bgColor = IndexedColors.WHITE;
        private String dataFormat;
    }

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class ExcelConfigData {
        private List<StyleData> styles;
        @Builder.Default
        private int freezeColOrder = -1;
        private boolean freezeHeader;
        @Builder.Default
        private int rowHeight = 16;
    }
}
